DYLEMAT STUDENTA - WYTRAWNE WINO CZY TANIE I OBIAD?¶

Wyznaczanie jakości wina na podstawie parametrów cieczy. | Aplikacja dla urzędu kontrolującego winiarnie¶

Celem projektu jest porównanie w zależności od problemu(regresja/klasyfikacja) różnego rodzaju modeli wraz z różnego rodzaju hiperparametrami.

● https://www.kaggle.com/uciml/red-wine-quality-cortez-et-al-2009

Team members:

  • Monika Janicka
  • Tomasz Kamiński
  • Artur Kłapciński
  • Elżbieta Kondracka-Zwolska
Analizowany zbiór dotyczy portugalskiego czerwonego wina „Vinho Verde”.¶
Dane zostały zebrane od maja 2004 do lutego 2007.¶
Każda próbka posiada informacje na temat najczęstszych badań fizykochemicznych oraz ostateczną ocenę, która jest medianą ocen trzech ekspertów w skali od 1 do 10.¶
Zbiór posiada 11 zmiennych wejściowych (m.in. PH, kwasowość, alkohol, chlorki, siarczany) oraz zmienną wyjściową - jakość.¶
  1. BIBLIOTEKI
  2. DANE_&_WYKRESY
  3. PREPROCESSING
  4. MODELE 4.1 MODEL1_REGRESJA_LINEARNA 4.2 MODEL2_REGRESJA_LOGISTYCZNA 4.3 MODEL3_DECISION_TREE 4.4 MODEL4_RANDOM_FOREST 4.5 MODEL5_GBOOST
  5. PORÓWNANIE_MODELI

2. DANE_&_WYKRESY¶

Zbiór zawiera 1599 wierszy i 11 kolumn. Zmienną wynikową jest quality.

Pairplot¶

In [4]:
pairplot();
In [6]:
wykresy_pudelkowe();

Boxploty i barploty¶

In [8]:
wykresy_zmienne();
In [10]:
wykresy_zmienne_1()

Analiza korelacji.¶

In [12]:
analiza_korelacji()

3. PREPROCESSING¶

Analiza duplikatów¶

Zbiór zawiera 240 zduplikowanych wartości. Ponieważ nie ma informacji o tym, jak pobrano próbki zestawu danych, zakładamy, że mamy do czynienia z drugim przypadkiem i dlatego zachowujemy duplikaty.

Brakujące wartości¶

Zbiór nie zawiera brakującyh wartości

Na podstawie wstępnej analizy danych do modelu zostało wybranych 7 zmiennych:¶

volatile acidity, citric acid,total sulfur dioxide, density, sulphates, alcohol,quality   
In [20]:
wykres_feats()

Usuwamy outliery¶

Przekształcamy zmienne zależne na wartości binarne :¶

  • 1 - Wina powyżej lub równe 7 zostały zmienione na 1, co oznacza wino dobrej jakości;
  • 0 - Wina o quality mniejszej od 7 zostały zmnienione na 0: zła lub przeciętna jakość

Zbiór danych ma znacznie większą liczbę wartości 0, co wskazuje, że dane zawierają więcej wierszy, które reprezentują złą jakość wina. Zbiór jest mocno niezbalansowany.

In [32]:
wykres_quality()

Standaryzacja¶

 Do niektórych modeli dane muszą być znormalizowane. 
 W tym celu tworzymy kopię danych, które poddajemy standaryzacji.
 Model drzewa decyzyjnego i lasu losowego budowany jest na danych niestandaryzwoanych.
 Ponieważ zbiór jest mocno niezrónoważony stosujemy oversampling - metody SMOTE.
In [36]:
wykres_plotting()
In [38]:
wykres_rownolegly()
In [40]:
wykres_odrebnosci_cech()

4. MODELE¶

Ponieważ zmienna wynikowa po przekształceniu przyjmuje wartości 0 lub 1 wybraliśmy następujące modele:

  • Logistic Regression
  • Decision Tree
  • RandomForest1
  • XgBoost

Modele te zostały wybrane, żeby móc odpowiedzieć na następujące pytania:

  • Który algorytm uczenia maszynowego umożliwi najdokładniejsze przewidywanie jakości wina na podstawie jego właściwości fizykochemicznych?
  • Jakie właściwości fizykochemiczne czerwonego wina mają największy wpływ na jego jakość?

Stworzyliśmy również model K-Means.

Zastosowane metryki:¶

- Recall
- Precision
- F1
- AUC

4.1. MODEL REGRESJA LOGISTYCZNA¶

In [47]:
print(classification_report(y_test, pred_test,target_names=["słabe", "dobre"]))
              precision    recall  f1-score   support

       słabe       0.94      0.95      0.95       262
       dobre       0.68      0.60      0.63        42

    accuracy                           0.90       304
   macro avg       0.81      0.77      0.79       304
weighted avg       0.90      0.90      0.90       304

In [48]:
LABELS = ['słabe', 'dobre']
conf_matrix = confusion_matrix(y_test, pred_test)
plt.figure(figsize =(5, 5))
sns.heatmap(conf_matrix, xticklabels = LABELS, 
            yticklabels = LABELS, annot = True, fmt ="d");
plt.title("Confusion matrix")
plt.ylabel('True class')
plt.xlabel('Predicted class')
plt.show()
In [50]:
RocCurveDisplay.from_estimator(model_LR, X_test_scal, y_test);
In [53]:
grid_search = GridSearchCV(LogisticRegression(penalty='l2'), param_grid=params,scoring='recall',cv=5)

grid_search.fit(X_train_scal, y_train)
Out[53]:
GridSearchCV(cv=5, estimator=LogisticRegression(),
             param_grid={'C': [0.001, 0.01, 0.1, 1, 10],
                         'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag',
                                    'saga']},
             scoring='recall')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
GridSearchCV(cv=5, estimator=LogisticRegression(),
             param_grid={'C': [0.001, 0.01, 0.1, 1, 10],
                         'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag',
                                    'saga']},
             scoring='recall')
LogisticRegression()
LogisticRegression()

4.2. MODEL DECISION TREE¶

In [63]:
# Wykres ważności cech w odniesieniu do największej bezwzględnej wartości współczynnika regresji. Użyta do tej funkcja wizualizuj sama argument relative= True który powoduje że największej wartość jest przypisywana liczba 
# 100 lub minus 100 a pozostałem wartością proporcjonalnie mniejsze liczby. 
from yellowbrick.model_selection import FeatureImportances
fig, ax = plt.subplots (figsize=(6, 4))
fi_viz = FeatureImportances (dt)
fi_viz.fit(X, y)
fi_viz.ax.set(title="Ważność 6 cech (drzewo decyzyjne)", xlabel = "Względna ważność")
Out[63]:
[Text(0.5, 1.0, 'Ważność 6 cech (drzewo decyzyjne)'),
 Text(0.5, 0, 'Względna ważność')]
In [65]:
import graphviz.backend as be
from dtreeviz.trees import *
viz = dtreeviz(dt, X,y,target_name="cel",feature_names=X.columns, class_names=["słabe", "dobre"],scale=(0.8))
viz
# viz.save("decision_tree.svg")
#Wykres pokazuje informacje o funkcjonowaniu drzewa. Obraz drzewa z 100 histogramami zawierającymi cenne informacje
Out[65]:
G cluster_legend node4 2022-09-10T12:52:09.706158 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node7 2022-09-10T12:52:09.859833 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ leaf5 2022-09-10T12:52:14.299790 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node4->leaf5 leaf6 2022-09-10T12:52:14.346588 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node4->leaf6 leaf8 2022-09-10T12:52:14.377873 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node7->leaf8 leaf9 2022-09-10T12:52:14.422036 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node7->leaf9 node3 2022-09-10T12:52:10.026798 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node3->node4 node3->node7 node10 2022-09-10T12:52:10.507813 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node11 2022-09-10T12:52:10.185865 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node14 2022-09-10T12:52:10.344893 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ leaf12 2022-09-10T12:52:14.468863 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node11->leaf12 leaf13 2022-09-10T12:52:14.500119 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node11->leaf13 leaf15 2022-09-10T12:52:14.562669 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node14->leaf15 leaf16 2022-09-10T12:52:14.593848 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node14->leaf16 node10->node11 node10->node14 node2 2022-09-10T12:52:10.695847 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node2->node3 node2->node10 node17 2022-09-10T12:52:11.781027 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node19 2022-09-10T12:52:10.831197 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node22 2022-09-10T12:52:10.971672 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ leaf20 2022-09-10T12:52:14.640689 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node19->leaf20 leaf21 2022-09-10T12:52:14.671937 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node19->leaf21 leaf23 2022-09-10T12:52:14.718846 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node22->leaf23 leaf24 2022-09-10T12:52:14.765741 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node22->leaf24 node18 2022-09-10T12:52:11.112273 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node18->node19 node18->node22 node25 2022-09-10T12:52:11.627941 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node26 2022-09-10T12:52:11.252901 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node29 2022-09-10T12:52:11.471644 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ leaf27 2022-09-10T12:52:14.812613 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node26->leaf27 leaf28 2022-09-10T12:52:14.865056 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node26->leaf28 leaf30 2022-09-10T12:52:14.917029 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node29->leaf30 leaf31 2022-09-10T12:52:14.969038 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node29->leaf31 node25->node26 node25->node29 node17->node18 node17->node25 node1 2022-09-10T12:52:11.944693 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node1->node2 node1->node17 node32 2022-09-10T12:52:14.081324 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node35 2022-09-10T12:52:12.085320 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node38 2022-09-10T12:52:12.225944 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ leaf36 2022-09-10T12:52:15.016098 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node35->leaf36 leaf37 2022-09-10T12:52:15.059104 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node35->leaf37 leaf39 2022-09-10T12:52:15.111012 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node38->leaf39 leaf40 2022-09-10T12:52:15.160108 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node38->leaf40 node34 2022-09-10T12:52:12.350927 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node34->node35 node34->node38 node41 2022-09-10T12:52:12.757209 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node42 2022-09-10T12:52:12.491519 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node45 2022-09-10T12:52:12.616530 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ leaf43 2022-09-10T12:52:15.210119 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node42->leaf43 leaf44 2022-09-10T12:52:15.263030 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node42->leaf44 leaf46 2022-09-10T12:52:15.311055 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node45->leaf46 leaf47 2022-09-10T12:52:15.369106 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node45->leaf47 node41->node42 node41->node45 node33 2022-09-10T12:52:12.882177 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node33->node34 node33->node41 node48 2022-09-10T12:52:13.819694 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node50 2022-09-10T12:52:13.022770 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node53 2022-09-10T12:52:13.147768 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ leaf51 2022-09-10T12:52:15.419020 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node50->leaf51 leaf52 2022-09-10T12:52:15.470075 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node50->leaf52 leaf54 2022-09-10T12:52:15.520056 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node53->leaf54 leaf55 2022-09-10T12:52:15.573045 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node53->leaf55 node49 2022-09-10T12:52:13.288396 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node49->node50 node49->node53 node56 2022-09-10T12:52:13.694645 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node57 2022-09-10T12:52:13.413394 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node60 2022-09-10T12:52:13.554019 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ leaf58 2022-09-10T12:52:15.627012 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node57->leaf58 leaf59 2022-09-10T12:52:15.670024 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node57->leaf59 leaf61 2022-09-10T12:52:15.705953 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node60->leaf61 leaf62 2022-09-10T12:52:15.752867 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node60->leaf62 node56->node57 node56->node60 node48->node49 node48->node56 node32->node33 node32->node48 node0 2022-09-10T12:52:14.221630 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/ node0->node1 ≤ node0->node32 > legend 2022-09-10T12:52:09.455882 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/
In [66]:
prediction_tr = dt.predict(X_train)
prediction_ts = dt.predict(X_test)
print(sklearn.metrics.classification_report(y_test, prediction_ts, target_names=["słabe", "dobre"]))
              precision    recall  f1-score   support

       słabe       0.94      0.94      0.94       262
       dobre       0.60      0.60      0.60        42

    accuracy                           0.89       304
   macro avg       0.77      0.77      0.77       304
weighted avg       0.89      0.89      0.89       304

In [74]:
raport_drzewo()

Jeżeli klasy nie są zrównoważone wtedy na podstawie krzywej ROC można wyciągnąć nadmiernie optymistyczne wnioski. Dlatego stosowany jest inny sposób oceniania klasyfikatora polegające na wykreśleniu krzywej Precision- Recall curve. Klasyfikacja to zrównoważony proces wyszukiwania potrzebnych danych (czułość) przy jednoczesnym ograniczeniu błędnych wyników (precyzja). Zazwyczaj trzeba znaleźć kompromis między tymi pojęciami. Im większa czułość tym mniejsza precyzja i odwrotnie.

In [79]:
prezycja_czulosc_drzewo()
0.5077767514532168
In [81]:
wykres_rownowaga_klas_drzewo()
In [83]:
wykres_blad_prognozowania_klas()
In [85]:
wykres_analiza_lime_drzewo()
In [87]:
plot_roc_curve(dt, X_test, y_test)
Out[87]:
<sklearn.metrics._plot.roc_curve.RocCurveDisplay at 0x2a98d923ee0>
In [91]:
wykres_regresji_przy_uzyciu_drzewa()

4.3. MODEL RANDOM FOREST¶

In [100]:
raport_las()
In [101]:
#ROC_RF = plot_roc_curve(rfc, X_test, y_test)
#plt.show()
RocCurveDisplay.from_estimator(rfc, X_test, y_test);

Zbiór jest mocno niezrównoważony.¶

W celu zrównoważenia danych używam oversamplingu ( metoda SMOTE). Tworzę model z parametrem sampling_strategy=0.75

In [108]:
ax = sns.countplot(x=y_res2)
abs_values = y_res2.value_counts().values
ax.bar_label(container=ax.containers[0], labels=abs_values);
In [116]:
las_po_oversamplingu()
In [118]:
%matplotlib inline
import seaborn as sns

sns.barplot(x=feature_imp, y=feature_imp.index)

plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.title("Visualizing Important Features")
#plt.legend()
plt.show()
In [122]:
wykres_blad_prognozowania_klas()
In [123]:
RocCurveDisplay.from_estimator(rfc_over2, X_test, y_test);
In [126]:
wykres_analiza_lime_las()
In [131]:
params={'criterion': ['gini','entropy'],
        'n_estimators': [100,200,50,20],
        'max_depth': [2,4,5,10,None],
        'min_samples_leaf': [1, 2, 3, 4, 5, 10, 20, 25],
        'max_features':['sqrt','log2',None]
        }
In [132]:
grid_search_over = GridSearchCV(rfc_over2, param_grid=params, cv=5, scoring='recall', n_jobs=-1,verbose=1)

grid_search_over.fit(X_res2, y_res2)
Fitting 5 folds for each of 960 candidates, totalling 4800 fits
Out[132]:
GridSearchCV(cv=5, estimator=RandomForestClassifier(random_state=42), n_jobs=-1,
             param_grid={'criterion': ['gini', 'entropy'],
                         'max_depth': [2, 4, 5, 10, None],
                         'max_features': ['sqrt', 'log2', None],
                         'min_samples_leaf': [1, 2, 3, 4, 5, 10, 20, 25],
                         'n_estimators': [100, 200, 50, 20]},
             scoring='recall', verbose=1)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
GridSearchCV(cv=5, estimator=RandomForestClassifier(random_state=42), n_jobs=-1,
             param_grid={'criterion': ['gini', 'entropy'],
                         'max_depth': [2, 4, 5, 10, None],
                         'max_features': ['sqrt', 'log2', None],
                         'min_samples_leaf': [1, 2, 3, 4, 5, 10, 20, 25],
                         'n_estimators': [100, 200, 50, 20]},
             scoring='recall', verbose=1)
RandomForestClassifier(random_state=42)
RandomForestClassifier(random_state=42)

4.4. MODEL XGBOOST¶

In [141]:
# Wykres ważności cech w odniesieniu do największej bezwzględnej wartości współczynnika regresji. Użyta do tej funkcja wizualizuj sama argument relative= True który powoduje że największej wartość jest przypisywana liczba 
# 100 lub minus 100 a pozostałem wartością proporcjonalnie mniejsze liczby. 
from yellowbrick.model_selection import FeatureImportances
fig, ax = plt.subplots (figsize=(6, 4))
fi_viz = FeatureImportances (xgb_model)
fi_viz.fit(X, y)
fi_viz.ax.set(title="Ważność 6 cech (XGBoost)", xlabel = "Względna ważność")
Out[141]:
[Text(0.5, 1.0, 'Ważność 6 cech (XGBoost)'), Text(0.5, 0, 'Względna ważność')]
In [150]:
raport_XGBoost()
In [152]:
prezycja_czulosc_xgboost()
0.7624161858790544
In [154]:
rownowaga_klas_xgboost()
In [156]:
wykres_blad_prognozaowania_klas_XGboost()
In [158]:
wykres_lime_xgboost()
In [161]:
xgb_reg_model_X_sul=df[['sulphates']].values 
xgb_reg_model_y_q=df['alcohol'].values
xgb_reg_model = xgb.XGBRegressor(random_state=123, n_estimators=5, max_depth=7)
xgb_reg_model.fit(xgb_reg_model_X_sul, xgb_reg_model_y_q)
xgb_reg_model_sort_idx= xgb_reg_model_X_sul. flatten().argsort()
lin_regplot (xgb_reg_model_X_sul[xgb_reg_model_sort_idx], xgb_reg_model_y_q[xgb_reg_model_sort_idx], xgb_reg_model) 
plt.xlabel('Nieliniowy związek zmiennych [sulphates i alkohol]-trend kształtujący dane') 
plt.ylabel('Zawartość alkoholu')
Out[161]:
Text(0, 0.5, 'Zawartość alkoholu')

4.5. KMEANS¶

In [170]:
for i in unique_labels:
    plt.scatter(X[label==i,0], X[label==i,1], label=i, s=20)
    
plt.legend()
plt.title('wine groups')
plt.show
Out[170]:
<function matplotlib.pyplot.show(close=None, block=None)>

5. PORÓWNANIE MODELI¶

Porównanie metryk stworzonych modeli - na zbiorze testowym¶

Wszystkie modele zostały przetestowane cross_val_score, natomiast parametry zostały wybrane za pomocą GridSearchCV Metryką, która była dla nas najbardziej istotna jest Recall, która jest intuicyjnie zdolnością klasyfikatora do znalezienia wszystkich pozytywnych próbek. Poniżej tabelka z porównaniem metryk dla modeli.

Ocena jakosci modeli (StratifiedKFold)¶

In [178]:
# ewaluacja modeli
for model in models:
    run_model(model, X_train, y_train, skf)
LogisticRegression fbeta: 0.4574, accuracy: 0.8771, time: 0.20085358619689941
DecisionTreeClassifier fbeta: 0.5188, accuracy: 0.8729, time: 0.062445640563964844
RandomForestClassifier fbeta: 0.6261, accuracy: 0.8985, time: 1.8210985660552979
XGBClassifier fbeta: 0.5824, accuracy: 0.8870, time: 0.7411484718322754

sprawdzenie na zbiorze testowym¶

In [184]:
print("-----Wyniki f-beta na zbiorze testowym-----")
print("Logistic Regression f-beta: {:.4f}".format(fbeta_LR))
print("Decision Tree f-beta: {:.4f}".format(fbeta_DT))
print("RandomForest f-beta: {:.4f}".format(fbeta_RF))
print("XGBoost f-beta: {:.4f}".format(fbeta_XGB))
-----Wyniki f-beta na zbiorze testowym-----
Logistic Regression f-beta: 0.6173
Decision Tree f-beta: 0.5952
RandomForest f-beta: 0.6959
XGBoost f-beta: 0.7071

Confusion matrix dla XGBoost¶

In [187]:
confusion_matrix_model_the_best()

wspólna krzywa ROC¶

In [191]:
wykres_ROC_all();
<Figure size 576x432 with 0 Axes>

Porównanie ważności cech między modelami drzewa i lasu losowego¶

In [201]:
wykres_porownanie_waznosci_cech()
In [213]:
import shap 
shap.initjs()
exp = shap. TreeExplainer (xgr)
vals = exp.shap_values (X_train)
shap.force_plot(exp.expected_value,vals [sample_idx], X_train.iloc[sample_idx],)

#Utworzono obiekt TreeExplainer i wyliczono wartość shap dla próbek. Po utworzeniu obiektu w wyliczeniu wartości utworzona wykres siłowy ułatwiające interpretację prognozowanych wartości
# Wykres siłowy opisujący model regresyjny; poszczególne cechy obniżają wartość bazową z 0,137 do 27
# Base Value to prognozowana wartość bazowa,  czerwone cechy to te które podnoszą jakość wszystkie to te które obniżają jakość.  
Out[213]:
Visualization omitted, Javascript library not loaded!
Have you run `initjs()` in this notebook? If this notebook was from another user you must also trust this notebook (File -> Trust notebook). If you are viewing this notebook on github the Javascript has been stripped for security. If you are using JupyterLab this error is because a JupyterLab extension has not yet been written.
In [214]:
# Można również utworzyć wykres siłowy dla wszystkich próbek i uzyskać w ten sposób obraz działania całego modelu. 
# Jeżeli w środowisku Jupyter jest włączo na obsługa skryptów JavaScript, po umieszczeniu nad próbką wskaźnika my szy pojawia się informacja o cechach, 
# które wpływają na prognozowany wynik. Poniższy kod tworzy interaktywny wykres:

shap.force_plot( exp.expected_value, vals, X_train)
Out[214]:
Visualization omitted, Javascript library not loaded!
Have you run `initjs()` in this notebook? If this notebook was from another user you must also trust this notebook (File -> Trust notebook). If you are viewing this notebook on github the Javascript has been stripped for security. If you are using JupyterLab this error is because a JupyterLab extension has not yet been written.